<?php
/**
 * 公共函数库
 * 
 * Created		: 2011-07-06
 * Modified		: 2011-07-06 
 * @link		: http://www.qixbo.com
 * @copyright	: [Qixbo.Com] (c) 2011
 * @version		: 0.1.0
 * @author		: Joseph Chen (jsph.chen@gmail.com)
 */
/**
 * 自动加载类文件
 * @param string $className 
 * @author : Joseph Chen (jsph.chen@gmail.com)
 */
function __autoload($className)
{
	if(class_exists($className, false)) {
		return true;
	}
	try {
		
		require $className.'.class.php';
		L(strtolower($className));
		
	} catch (Exception $e) {
		
		throw new Exception(
			sprintf($GLOBALS['LClassFileIsNotExists'], $cls_name),
			E_USER_ERROR
		);
		
	}
	return true;
}

/**
 * Config
 * 载入一个/多个配置文件 ,并返回配置数据
 * @param $cfgName,.... 配置名
 */
function C()
{
	$Cs = func_get_args();
	$c = array();
	foreach ($Cs as $cfgName)
	{
		$cfgFile = $GLOBALS['app_cfg'].$cfgName.'.cfg.php';
		if (is_file($cfgFile))
		{
			$tmp = include $cfgFile;
			if (!is_array($tmp))
			{
				continue;
			}
			$c = $c+$tmp;
		}
	}
	return $c;
}

/**
 * 载入语言文件
 * @param $cfgName 配置文件名称
 */
function L()
{
	global $app_lang, $lang;
	$Ls = func_get_args();
	$ret = false;
	foreach ($Ls as $lang_name)
	{
		$lang_file = $app_lang.$lang.'/'.$lang_name.'.lang.php';
		if (is_file($lang_file))
		{
			$tmp = include_once $lang_file;
			if (!is_array($tmp))
			{
				continue;
			}
			$ret = true;
			$GLOBALS = $GLOBALS+$tmp;
		}
		// 各子站点自己定义的文件合并到默认包中
		if (isset($app_sign)) {
			$lang_file = $app_lang.$app_sign.$lang.'/'.'/'.$lang_name.'.lang.php';
		}
		if (is_file($lang_file)) {
			$tmp = include_once $lang_file;
			if (!is_array($tmp))
			{
				continue;
			}
			$ret = true;
			$GLOBALS = $GLOBALS+$tmp;
		}
	}
	return $GLOBALS;
}

/**
 * 特殊加密url,防止地址被解析不完全
 *
 * @param string $class
 * @return string
 * @author 
 */
function iurlencode($key)
{
	if(preg_match('/^apache/i', $_SERVER['SERVER_SOFTWARE']))
	{
		//Apache在重写情况下 “/” 需要加密两次，否则Url rewrite出错
		return rawurlencode(str_replace(array('/', '?', '&', '#'), array( Core_Config::get('seo', 'basic', 0) ? '%252F' : '%2F', '%3F', '%26', '%23'), $key));
	} else {
		return rawurlencode(str_replace(array('/', '?', '&', '#'), array('%2F', '%3F', '%26', '%23'), $key));
	}
}

/**
 * 特殊url解密,防止地址不是原地址
 *
 * @param string $class
 * @return string
 * @author icehu
 */
function iurldecode($key)
{
	$key = rawurldecode($key);
	if(preg_match('/^apache/i', $_SERVER['SERVER_SOFTWARE']))
	{
		//Apache 会自动解码一次
		return str_replace(array('%2F') , array('/') , $key);
	} else {
		return str_replace(array('%2F', '%3F', '%26', '%23'), array('/', '?', '&', '#'), $key);
	}
}



/* 目录及文件操作函数 */
/**
 * mkdir 的扩展,可以递归创建目录
 * @param $path 设置的目录
 * @param $mode 目录的模式
 * @return boolean
 */
function mkdirext($path, $mode=0775)
{
	if (is_dir($path))
	{
		return true;
	}
	//From php5.0.0, The recursive parameter was added  
	mkdir($path, $mode, true);
	return $path;
}

# 读取不含后缀名的文件名
function getfilename($string='')
{
	$pattern = '/([\w]+)([\.a-zA-Z0-9])/';
	preg_match($pattern,$string,$matches);
	return $matches[1];
}

/**
 * 获取文件的扩展名
 * @param string $filename
 * @param boolean $incdot 后缀是否包含点号
 */
function fileext($filename, $incdot=0)
{
	if ($incdot)
	{
		return strrchr($filename, '.');
	} else {
		return substr(strrchr($filename, '.'), 1);
	}
}

/**
 * 将数据写入文件
 * @param $file 文件名
 * @param $writetext 写入文件的数据
 * @param $filemod 文件类型：text | php
 * @param $openmod 打开文件的模式
 * @param $exit 写入错误是否退出程序
 * @return boolean
 */
function writefile($file,$writetext,$filemod='text',$openmod='w',$exit=1)
{
	mkdirext(dirname($file));
	if(!@$fp = fopen($file, $openmod))
	{
		if($exit)
		{
			exit('File :<br>'.path_format($file).'<br>Have no access to write!');
		} else {
			return false;
		}
	} else {
		$text = '';
		if($filemod == 'php')
		{
			$text = "<?php\r\n";
		}
		$text .= $writetext;
		if ($filemod == 'php' && substr($text, -1) != ';') {
			$text .= ';';
		}
		flock($fp, 2);
		fwrite($fp, $text);
		fclose($fp);
		return true;
	}
}


	
/**
 * 异常处理
 * @param object $e
 */
function exceptionHandler($e)
{
	$str  = '<pre>';
	$str .= $e->getMessage()."\n";
	$str .= "File: ".$e->getFile();
	$str .= "\n";
	$str .= "Line: ".$e->getLine();
	$str .= "\n";
	$str .= $e->getTraceAsString();
	$str .= "\n".str_repeat('+', 50)."\n";
	$str .= "\n";
	$die = 0;
	$errno = $e->getCode();
	switch ($errno) {
		case E_ERROR:
		case E_USER_ERROR: // 256
			$err_type = 'PHP Error';
			$die = 1;
			break;
		case E_WARNING:
		case E_USER_WARNING :
			$err_type = 'PHP Warning';
			break;
		case E_PARSE:
			$err_type = 'Parse Error';
			$die = 1;
			break;
		case E_NOTICE:
		case E_USER_NOTICE :
			$err_type = 'PHP Notice';
			break;
		default:
			$err_type = 'Unknow Error';
			break;
	}
	$str = $err_type.'[#'.$errno.']: '.$str;
	if ($GLOBALS['debug']) {
		echo $str;
	} else {
		// 写错误到日志文件中
		$file = 'Exception/'.date('Y,m,d').'.log';
		if (is_file($file) && filesize($file)) {
			// 异常文件太大了，赶紧报警
		}
		App::log($file, $str);
		header('content-type:text/plain;charset=utf-8');
		echo $GLOBALS['LErrorOccurredInRuntimeCode'];
		echo "\r\n\r\n";
		echo $GLOBALS['LErrorOccurredInRuntime'];
	}
	echo "</pre>";
	if ($die == 1) {
		die();
	}
}
	
/**
 * 错误处理
 * @param int $errno
 * @param string $error
 * @param string $errfile
 * @param int $errline
 */
function errorHandler($errno, $error, $errfile, $errline)
{
	$str  = '<pre>';
	$str .= $error."\n";
	$str .= "File: ".$errfile;
	$str .= "\n";
	$str .= "Line: ".$errline;
	$str .= "\n".str_repeat('+', 50)."\n";
	$str .= "\n";
	$die = 0;
	switch ($errno) {
		case E_ERROR:
		case E_USER_ERROR: // 256
			$err_type = 'Error';
			$die = 1;
			break;
		case E_WARNING:
		case E_USER_WARNING :
			$err_type = 'Warning';
			break;
		case E_CORE_ERROR:
		case E_COMPILE_ERROR:
			$str = 'Fatal Error: '.$str;
			$die = 1;
			break;
		case E_PARSE:
			$err_type = 'Parse Error';
			$die = 1;
			break;
		case E_NOTICE:
		case E_USER_NOTICE :
			$err_type = 'Notice';
			break;
		default:
			$err_type = 'Unknow Error';
			break;
	}
	$str = $err_type.'[#'.$errno.']: '.$str.'</pre>';
	if ($GLOBALS['debug']) {
		echo $str;
	} else {
		// 写错误到日志文件中
		$file = 'Error/'.date('Y,m,d').'.log';
		if (is_file($file) && filesize($file)) {
			// 异常文件太大了，赶紧报警
		}
		App::log($file, $str);
	}
	if ($die == 1) {
		die();
	}
	return true;
}